
18.02.2017, 15:44
|
Интересующийся
|
|
Регистрация: 14.02.2017
Сообщений: 12
|
|
AJAX обработка форм
Столкнулся с проблемой при выполнении AJAX обработки форм:
Форма:
<form method="post" action="functions/auth.php">
<ul id="inputEmailPass">
<h3>Вход</h3>
<p id="messageAuth">Неверный логин или пароль!</p>
<li><center><input type="text" name="authLogin" id="authLogin" placeholder="Введите логин"></center></li>
<li><center><input type="password" name="authPass" id="authPass" placeholder="Пароль"></center></li>
<ul id="listAuth">
<li><input type="checkbox" name="rememberMe" id="rememberMe"><label for="rememberMe">Запомнить меня</label></li>
<li><a id="remindPass" href="#">Забыли пароль?</a></li>
</ul>
<p align="right" id="buttonAuth"><a>Вход</a></p>
</ul>
</form>
$(document).ready(function() {
var authLogin = $("#authLogin").val();
var authPass = $("#authPass").val();
if(authLogin === "" || authLogin.length > 30) {
$("#authLogin").css("borderColor", "#FDB6B6");
sendLogin = 'no';
} else {
$("#authLogin").css("borderColor", "#DBDBDB");
sendLogin = 'yes';
}
if(authPass === "" || authPass.length > 15) {
$("#authPass").css("borderColor", "#FDB6B6");
sendPass = 'no';
} else {
$("#authPass").css("borderColor", "#DBDBDB");
sendPass = 'yes';
}
if($("#rememberMe").prop('checked')) {
authRememberMe = 'yes';
} else {
authRememberMe = 'no';
}
if(sendLogin === 'yes' && sendPass === 'yes') {
$("#buttonAuth").hide();
$.ajax({
type: "POST",
url: "functions/auth.php",
data: "login=" + authLogin + "&pass=" + authPass + "&rememberMe=" + authRememberMe,
dataType: "html",
cache: false,
success: function(data) {
if(data == 'yesAuth'){
location.reload();
} else {
$("#messageAuth").slideDown(400);
$("#buttonAuth").show();
}
}
});
}
});
});
и PHP обработчик:
<?php
require_once "functions.php";
if($_SERVER["REQUEST_METHOD"] == "POST") {
$login = strtolower(clearString($_POST['login']));
$pass = strrev(md5(clearString($_POST['pass'])));
$pass = strtolower("ah40d".$pass."m6me9w");
if($_POST['remrmberMe'] == 'yes'):
setcookie('rememberMe', $login.'+'.$pass, time() + 3600*24*31, "/");
endif;
connectDB();
$query = $mysqli->query("SELECT * FROM `users` WHERE `login`='$login' AND `pass`='$pass'");
closeDB();
$rows = $query->num_rows;
if($rows > 0):
$userSession = resultToArray($query);
$_SESSION['auth'] = 'yesAuth';
$_SESSION['authPass'] = $userSession['pass'];
$_SESSION['authLogin'] = $userSession['login'];
$_SESSION['authSurname'] = $userSession['surname'];
$_SESSION['authName'] = $userSession['name'];
$_SESSION['authPatronymic'] = $userSession['patronymic'];
$_SESSION['authAddress'] = $userSession['address'];
$_SESSION['authPhone'] = $userSession['phone'];
$_SESSION['authEmail'] = $userSession['email'];
echo 'yesAuth';
else: echo 'noAuth';
endif;
}
Обработчик PHP проверял отдельно (менял POST на GET и передавал переменные) - возвращает "yesAuth", а вот все вместе не работает - пишет "не верный логин или пароль"...
В чем может быть проблема? я как то не правильно передаю формы? 
|
|

18.02.2017, 18:44
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
$pass = strrev(md5(clearString($_POST['pass'])));
Это зачем? В базе пароли не хранят, в базе хранят хеш пароля, ибо если вот так делать запросы к базе как у вас
$login = strtolower(clearString($_POST['login']));
$pass = strrev(md5(clearString($_POST['pass'])));
$mysqli->query("SELECT * FROM `users` WHERE `login`='$login' AND `pass`='$pass'");
то пароли всех ваших пользователей будут у меня в кармане.
|
|

18.02.2017, 20:37
|
Интересующийся
|
|
Регистрация: 14.02.2017
Сообщений: 12
|
|
Спасибо за совет, учту, но вопрос то не в этом..
|
|

18.02.2017, 20:41
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от ПавелСедой
|
вопрос то не в этом..
|
Это как раз главное, делайте сначала это как положено, так как и проверка при этом будет совсем иная.
Открывайте руководство РНР и читайте о подготовленных запросах misqli. Если планируется использовать версию РНР не ниже 5.5, то можно использовать Password Hashing функции.
Сделаете это, а уж потом почему, если только они будут.
|
|

18.02.2017, 23:29
|
Интересующийся
|
|
Регистрация: 14.02.2017
Сообщений: 12
|
|
Сообщение от laimas
|
Сделаете это, а уж потом почему, если только они будут.
|
<?php
require_once "functions.php";
if($_SERVER["REQUEST_METHOD"] == "POST") {
$login = strtolower(clearString($_POST['login']));
$pass = strtolower(clearString($_POST['pass']));
if($_POST['remrmberMe'] == 'yes'):
setcookie('rememberMe', $login.'+'.$pass, time() + 3600*24*31, "/");
endif;
connectDB();
$quer = $mysqli->query("SELECT * FROM `users` WHERE `login`='$login'");
$userSession = $quer->fetch_array(MYSQLI_ASSOC);
$passForCrypt = crypt($pass ,$userSession['pass']);
if($userSession['pass'] == $passForCrypt):
$_SESSION['auth'] = 'yesAuth';
$_SESSION['authPass'] = $userSession['pass'];
$_SESSION['authLogin'] = $userSession['login'];
$_SESSION['authSurname'] = $userSession['surname'];
$_SESSION['authName'] = $userSession['name'];
$_SESSION['authPatronymic'] = $userSession['patronymic'];
$_SESSION['authAddress'] = $userSession['address'];
$_SESSION['authPhone'] = $userSession['phone'];
$_SESSION['authEmail'] = $userSession['email'];
$quer->close();
echo 'yesAuth';
else: echo 'noAuth';
endif;
closeDB();
}
Вот сделал так, всё равно результат не изменился... 
|
|

19.02.2017, 05:07
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от ПавелСедой
|
if($("#rememberMe").prop('checked')) {
authRememberMe = 'yes';
} else {
authRememberMe = 'no';
}
|
Выбросить, а на сервере проверка выбранного флажка, это if(isset($_POST['rememberMe'])), ибо не выбранные флажки клиентом на сервер не передаются.
Вы не сделали основного, что требовалось.
Последний раз редактировалось laimas, 19.02.2017 в 08:24.
|
|

19.02.2017, 11:36
|
Интересующийся
|
|
Регистрация: 14.02.2017
Сообщений: 12
|
|
Сообщение от laimas
|
Вы не сделали основного, что требовалось.
|
В таком случае я не могу понять что требуется сделать, объясните пожалуйста... Почему не подходит crypt()? Насколько я понял он же генерирует хэш с солью и уже их я храню в базе, не так?
|
|

19.02.2017, 11:42
|
Интересующийся
|
|
Регистрация: 14.02.2017
Сообщений: 12
|
|
Сообщение от laimas
|
Выбросить, а на сервере проверка выбранного флажка, это if(isset($_POST['rememberMe'])), ибо не выбранные флажки клиентом на сервер не передаются.
|
Сделал так, теперь когда нажимаю кнопку "Вход" - она прячется, а дальше вообще ничего не происходит.. Ошибку о не правильно логине или пароле не выдает и страница не перезагружается..
|
|

19.02.2017, 12:51
|
 |
Профессор
|
|
Регистрация: 20.12.2009
Сообщений: 1,714
|
|
Вам нельзя сделать кнопку отправки? <input type="submit">
Я не знаю, что у вас там отправлялось... без кнопки отправки.
Вы там написали скрипт, но он только один раз после загрузки документа срабатывает!
$(document).ready(function() {
// это сработает сразу, а вам надо когда пользователь отправляет форму
});
Проверил с
<?php
print_r($_POST);
Теперь работает...
Array
(
[login] => йцукен
[pass] => 12345
[rememberMe] => no
)
При проверке в форму добавил <input type="submit">
$(document).ready(function() { ... });
заменил на
$("form").on("submit", function() {
...
return false;
});
Последний раз редактировалось Malleys, 19.02.2017 в 12:56.
|
|

19.02.2017, 13:12
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от ПавелСедой
|
Почему не подходит crypt()? Насколько я понял он же генерирует хэш с солью и уже их я храню в базе, не так?
|
А где здесь $pass = strrev(md5(clearString($_POST['pass']))); crypt(), тут md5 перевернутая, где соль? ) Подойдет конечно, но если РНР 5.5 то то что я говорил. Ну а самое страшное, это дыра в запросе, да еще к такой таблице.
|
|
|
|